Fifth - virtual machine

Table of Contents

Current emulator emulates:

While I tried to keep instruction set simple, I was forced to put in some complex instructions to make performance acceptable on emulator.

CPU has following registers:

IP
instruction pointer
DSP
data stack pointer
RSP
return stack pointer

1. Instructions overview

Virtual CPU, commands (most of them are avaiable as ordinary commands in programming language):

# name stack footprint description
0 nop -- does nothing
1 halt -- halt CPU ( return to DOS on emulator )
2 kbd@ – c read scancode of pressed or released key
3 num <dword> – n put immidiate number into datastack
4 jmp <dword> -- jump to specified code
5 call <dword>   jump to specified code, save return address to return stack
6 1+ n – n+1  
7 1- n – n-1  
8 dup n – n n duplicate top of data stack
9 drop n -- drop last element in data stack
10 if <dword> n -- jump to addr if top element was 0
11 ret   jump to code, specified in return stack.
12 c@ addr – n read byte from memory at specified address
13 c! n addr -- store byte to specified memory
14 push DSTK -> RSTK move top of datastack to returnstack
15 pop RSTK -> DSTK move top of returnstack to datastack
16 <unused>    
17 rot n1 n2 n3 – n2 n3 n1 rotate stack elements
18 disk@ FromDiskSect ToMem -- read 1KB from disk into RAM
19 disk! FromMem ToDiskSect -- write 1KB to disk
20 @ addr – n read 32 bit number from memory
21 ! n addr -- store 32 bit number to memory
22 over n1 n2 – n1 n2 n1  
23 swap n1 n2 – n2 n1  
24 + n1 n2 – n1+n2  
25 - n1 n2 – n1-n2  
26 * n1 n2 – n1*n2  
27 / n1 n2 – n1/n2  
28 > n1 n2 – result is true when n1 > n2
29 < n1 n2 – result is true when n1 < n2
30 not n1 – not_n1 logical not
31 i – n copies top of return stack into datastack
32 cprt@ addr – n read one byte from hardware port
33 cprt! n addr -- store one byte to hardware port
34 i2 – n like "i" but takes second top stack element
35 i3 – n like "i" but takes third top stack element.
36 shl n amount – n left bit shift
37 shr n amount – n right bit shift
38 or n1 n2 – n logical or
39 xor n1 n2 – n exclusive logical or
40 vidmap addr -- copy memory from "addr" to video memory.
41 mouse@ – x y button read mouse coordinates & buttons
42 vidput addr1 addr2 x y -- put image1 into image2, at location x, y
43 cmove addr1 addr2 amount move memory from addr1 to addr2
44 cfill c addr amount -- fill memory starting at "addr" with "c" bytes.
45 tvidput addr1 addr2 x y -- put image with transparency support
46 depth – depth returns current depth of data stack.
47 charput colorfg colorbg addrsrc addrdest x y draw text character

1.1. kbd@ - read scancode of pressed or released key

Returns 0 if no data available.

1.2. vidput - put image1 into image2, at location x, y

Does clipping, so part of a big image can be mapped into smaller one.

1.3. cmove - copy memory array

Move memory from addr1 to addr2. If addr1 is greater than addr2 then count address foward while moving, elseway starts from end and counts backwards, so no data loss occurs when memory regions partially overlap.

1.4. tvidput - put image with transparency support

Stack footprint

addr1 addr2 x y --

Put image1 into image2, at location x, y with transparency support

Color 255 in source image is treated as transparent.

1.5. charput - draw text character

Draw character to image buffer located at "addrdest" to specified x & y location. Decodes 8 bytes from source to bits, used to draw character.

Author: Svjatoslav Agejenko

Created: 2023-09-18 Mon 01:46

Validate